#include <iostream>
#include <cstring>
using namespace std;
#define maxn 51
const int INF = 1<<30;

int m,n;
int a[maxn][maxn];
int dp[maxn][maxn][maxn][maxn];

int dfs(int ax, int ay, int bx, int by){
	if(dp[ax][ay][bx][by] >= 0) return dp[ax][ay][bx][by];
	if(ax==m && ay==n && bx==m && by==n) return 0;
	if(bx <= ax && bx != 1 || by >= ay && ay != 1) return -INF;
	int c=-INF;
	if(ax<m && bx<m) c=max(c, dfs(ax+1, ay, bx+1, by));
	if(ax<m && by<n) c=max(c, dfs(ax+1, ay, bx, by+1));
	if(ay<n && bx<m) c=max(c, dfs(ax, ay+1, bx+1, by));
	if(ay<n && by<n) c=max(c, dfs(ax, ay+1, bx, by+1));
	return dp[ax][ay][bx][by] = c+a[ax][ay]+a[bx][by];
}

int main(){
	memset(dp, -1, sizeof(dp));
	cin>>m>>n;
	for(int i=1; i<=m; i++)
		for(int j=1; j<=n; j++)
			cin>>a[i][j];
	
	cout << dfs(1,1,1,1) << endl;
	return 0;
}